package br.com.cast.syscast.persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.springframework.stereotype.Component;

import br.com.cast.syscast.models.Pais;

@Component 
public class PaisDAO extends DAOBase {
	
	public PaisDAO() {
	}
	
	public Iterator<Pais> consultaPaginada(long inicio, long fim) {
		
		List<Pais> paises = new ArrayList<>();
		
		String sql = "SELECT * FROM ("
						+ " SELECT *, ROW_NUMBER()"
						+ " OVER (ORDER BY id) as row"
						+ " FROM pais"
					+ ") a WHERE a.row > ? and a.row <= ?";
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ps.setLong(1, inicio);
			ps.setLong(2, fim);
			
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()) {
				
				Pais p = new Pais();
				p.setId(rs.getInt("id"));
				p.setNome(rs.getString("nome"));
				p.setArea(rs.getDouble("area"));
				p.setContinente(rs.getString("continente"));
				
				paises.add(p);
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
		return paises.iterator();
	}
	
	public void salvar(Pais pais) {
		
		String sql = "insert into pais (nome, area, continente)"
				+ " values(?, ?, ?);";
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ps.setString(1, pais.getNome());
			ps.setDouble(2, pais.getArea());
			ps.setString(3, pais.getContinente());
			
			ps.execute();
			
			ps.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void alterar(Pais pais) {
		String sql = "update pais set nome = ?, area = ?, "
					+ "continente = ? "
					+ "where id = ?";
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ps.setString(1, pais.getNome());
			ps.setDouble(2, pais.getArea());
			ps.setString(3, pais.getContinente());
			ps.setInt(4, pais.getId());
			
			ps.execute();
			
			ps.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public long total() {
		String sql = "SELECT COUNT(*) as total "
				+ "FROM pais";

		Long total = 2L;
		
		/*try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				total = rs.getLong("total");			
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}*/
		
		return total;
	}
	
	public void excluir(int id) {
		String sql = "DELETE FROM pais where id = ?";

		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			ps.setInt(1, id);
			
			ps.execute();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public boolean paisJaCadastrado(Pais pais) {
		
		String sql = "SELECT COUNT(*) as qtd "
					+ "FROM pais "
					+ "WHERE nome = ? ";
		
		if (pais.getId() != null) {//alteração
			//tem que existir um país que não seja ele mesmo
			//com o mesmo nome.
			//esse AND faz com que sejam verificados somente os outros países 
			//no fluxo de alteração
			sql += " AND id <> ? ";
		}

		Long qtd = null;
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ps.setString(1, pais.getNome());
			
			if (pais.getId() != null) {//alteração
				ps.setInt(2, pais.getId());
			}
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				qtd = rs.getLong("qtd");			
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
		return qtd > 0;
	}

	public List<Pais> consultaTodos() {
		List<Pais> paises = new ArrayList<>();
		
		/*String sql = " SELECT *"
					+ " FROM pais";
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()) {
				
				Pais p = new Pais();
				p.setId(rs.getInt("id"));
				p.setNome(rs.getString("nome"));
				p.setArea(rs.getDouble("area"));
				p.setContinente(rs.getString("continente"));
				
				paises.add(p);
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}*/
		
		return paises;
	}
	
}
